const NodeCache = require('node-cache');

// 创建缓存实例
const cache = new NodeCache({
  stdTTL: 300, // 默认缓存5分钟
  checkperiod: 60 // 每分钟检查过期缓存
});

/**
 * 缓存中间件
 * @param {Object} options - 缓存选项
 * @param {number} options.ttl - 缓存时间（秒）
 * @param {Function} options.key - 缓存键生成函数
 */
const cacheMiddleware = (options = {}) => {
  const {
    ttl = 300, // 默认缓存5分钟
    key = (ctx) => `${ctx.method}:${ctx.url}`
  } = options;

  return async (ctx, next) => {
    // 只缓存GET请求
    if (ctx.method !== 'GET') {
      return next();
    }

    // 生成缓存键
    const cacheKey = typeof key === 'function' ? key(ctx) : key;

    try {
      // 尝试从缓存获取数据
      const cachedData = cache.get(cacheKey);

      if (cachedData) {
        // 如果缓存命中，直接返回缓存数据
        ctx.body = cachedData;
        return;
      }

      // 继续处理请求
      await next();

      // 如果响应成功，缓存数据
      if (ctx.status === 200 && ctx.body) {
        cache.set(cacheKey, ctx.body, ttl);
      }
    } catch (error) {
      // 如果缓存出错，继续处理请求
      await next();
    }
  };
};

/**
 * 清除缓存
 * @param {string} pattern - 缓存键模式
 */
const clearCache = (pattern) => {
  const keys = cache.keys();
  const matchedKeys = keys.filter(key => key.includes(pattern));
  if (matchedKeys.length > 0) {
    cache.del(matchedKeys);
  }
};

module.exports = {
  cache: cacheMiddleware,
  clearCache
}; 